package demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component


public class Person extends Object {
    @Autowired
    @Qualifier("summer")

    /*
    当一个类中需要使用另一个类时，Spring要求我们将该类作为属性定义在当前类中
    以便Spring以“依赖注入”的形式将被依赖的类创建好然后通过属性注入到当前类供其使用

    Person在实现功能时需要使用到Shirt类，那我们就称为：Person需要“依赖”Shirt
    做法：
    1.在Person上定义一个类型为Shirt的属性
    2.为该属性添加@Autowired注解，告知Spring容器，Person类中依赖的Shirt类需要由容器
    创建并赋值到该属性上以供Person类使用，这个过程称为“将依赖的类通过属性注入进来”
    简称为：依赖，注入
     */
     /*
        Spring容器在自动装配时,会进行类型匹配,如果属性的类型是一个接口,那么Spring会自动寻找
        它的实现类来进行自动装配.
        如果Spring同时找到多个实现类,那么自动装配时会抛出异常,Spring容器无法做出决定到底应当
        用那个实现类注入到这里.
        此时我们可以为这些实现类的@Component注解添加一个参数,等同于为该组件取一个名字
        然后在属性需要注入这里除了添加自动装配注解@Autowired之外,再添加一个注解:@Qualifier
        并且指明使用那个组件.

        例如本案例
        Shirt,Sweater两个类都实现了Clothes接口
        那么这里Person中定义的属性:
        @Autowired
        private Clothes clothes;
        需要自动装配时就会报错.

        解决办法,为两个类:Shirt,Sweater上的@Component上分别指定名字,如:
        @Component("summer")
        public class Shirt implements Clothes{...


        @Component("winter")
        public class Sweater implements Clothes{...

        然后在Person这里的属性上再添加注解:@Qualifier,如:
        @Autowired
        @Qualifier("summer")
        private Clothes clothes;
        那么此时Spring容器会将Shirt注入,因为Shirt上的@Component("summer")中指明的
        名字为"summer".

     */
    /*
    private Shirt shirt;

    @Override
    public String toString() {
        return "Person{" +
                "shirt=" + shirt +
                '}';
    }

     */
    /*
    private Sweater sweater;

    @Override
    public String toString() {
        return "Person{" +
                "sweater=" + sweater +
                '}';
    }

     */
    private Clothes clothes;

    @Override
    public String toString() {
        return "Person{" +
                "clothes=" + clothes +
                '}';
    }
}
